home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / CONFIG.C < prev    next >
C/C++ Source or Header  |  1997-09-14  |  39KB  |  1,490 lines

  1. /* A collection of stuff heavily dependent on the configuration info
  2.  * in config.h. The idea is that configuration-dependent tables should
  3.  * be located here to avoid having to pepper lots of .c files with #ifdefs,
  4.  * requiring them to include config.h and be recompiled each time config.h
  5.  * is modified.
  6.  *
  7.  * Copyright 1991 Phil Karn, KA9Q
  8.  */
  9. /* Mods by PA0GRI */
  10.  
  11. #include "global.h"
  12. #include "commands.h"
  13. #ifdef MSDOS
  14. #include <conio.h>
  15. #endif
  16. #include "usock.h"
  17. #ifdef    ARCNET
  18. #include "arcnet.h"
  19. #endif
  20. #ifdef ETHER
  21. #include "enet.h"
  22. #endif
  23. #include "kiss.h"
  24. #include "pktdrvr.h"
  25. #include "ppp.h"
  26. #include "slip.h"
  27. #include "arp.h"
  28. #include "icmp.h"
  29. #ifndef MSDOS
  30. #define _TIPMAIL_H
  31. #endif
  32. #include "mailbox.h"
  33. #include "mailcli.h"
  34. #include "ax25mail.h"
  35. #include "nr4mail.h"
  36. #include "bootp.h"
  37. #include "rspf.h"
  38. #ifdef FORTH
  39. #include "forth.h"
  40. #endif
  41. #include "main.h"
  42. #include "gps.h"
  43. #include "x.h"
  44. #ifdef SQL
  45. #include "sql.h"
  46. #endif
  47. #ifdef    TRACE
  48. #include "trace.h"
  49. #endif
  50.  
  51. #if !defined(_lint)
  52. static char rcsid[] OPTIONAL = "$Id: config.c,v 1.46 1997/09/14 14:37:46 root Exp root $";
  53. #endif
  54.  
  55. #ifndef TRACE
  56. void dump (struct iface * iface, int direction, unsigned type, struct mbuf * bp);
  57. void raw_dump (struct iface * iface, int direction, struct mbuf * bp);
  58. #endif
  59.  
  60. static int dostart (int argc, char *argv[], void *p);
  61. static int dostop (int argc, char *argv[], void *p);
  62. static void network (int, void *, void *);
  63.  
  64. #ifdef  AX25
  65. static void axip (struct iface * iface, struct ax25_cb * axp, char *src,
  66.               char *dest, struct mbuf * bp, int mcast);
  67. static void axarp (struct iface * iface, struct ax25_cb * axp, char *src,
  68.                char *dest, struct mbuf * bp, int mcast);
  69. #ifdef RARP
  70. static void axrarp (struct iface * iface, struct ax25_cb * axp, char *src,
  71.                 char *dest, struct mbuf * bp, int mcast);
  72. #endif
  73. #ifdef NETROM
  74. static void axnr (struct iface * iface, struct ax25_cb * axp, char *src,
  75.               char *dest, struct mbuf * bp, int mcast);
  76. #endif
  77. #endif
  78.  
  79.  
  80. struct mbuf *Hopper;
  81. unsigned Nsessions = NSESSIONS;
  82. extern int cmdparse_newproc_type;
  83.  
  84. #ifndef UNIX
  85. /* Free memory threshold, below which things start to happen to conserve
  86.  * memory, like garbage collection, and refusing connects
  87.  */
  88. int32 Memthresh = MTHRESH;
  89.  
  90. #endif
  91.  
  92. /* these next few of lines are to keep from missing resources if
  93.    MBFWD is not defined. It brings certain items in from the fwding.a
  94.    library that would otherwise not be required in linking until after
  95.    the fwding.a library was parsed.
  96.  */
  97. #ifndef MBFWD
  98. extern int BIDuknos;
  99. int fake_BIDuknos = BIDuknos;
  100.  
  101. #include "fwdparse.h"
  102. typedef (void (*NULLFUNC)(void *));
  103. NULLFUNC fake_fwdfree = (NULLFUNC) fwdfree;
  104.  
  105. void fwdunlockit (char *name);
  106. NULLFUNC fake_fwdunlockit = (NULLFUNC) fwdunlockit;
  107. #endif
  108.  
  109.  
  110. /* Transport protocols atop IP */
  111. struct iplink Iplink[] =
  112. {
  113.     { TCP_PTCL,    tcp_input },
  114.     { UDP_PTCL,    udp_input },
  115.     { ICMP_PTCL,    icmp_input },
  116. #ifdef ENCAP
  117.     { ENCAP_PTCL,    ipip_recv },
  118.     { IP_PTCL,    ipip_recv },
  119. #endif
  120. #ifdef  AXIP
  121.     { AX25_PTCL,    axip_input },
  122. #endif
  123. #ifdef    RSPF
  124.     { RSPF_PTCL,    rspf_input },
  125. #endif /* RSPF */
  126.     { 0,        0 }
  127. };
  128.  
  129.  
  130. /* Transport protocols atop ICMP */
  131. struct icmplink Icmplink[] =
  132. {
  133.     { TCP_PTCL,    tcp_icmp },
  134.     { 0,        0 }
  135. };
  136.  
  137.  
  138. /* ARP protocol linkages */
  139. struct arp_type Arp_type[NHWTYPES] =
  140. {
  141. #ifdef    NETROM                    /* ARP_NETROM */
  142.     { AXALEN, 0, 0, 0, 0, NULLCHAR, pax25, setcall },
  143. #else
  144.     { 0, 0, 0, 0, 0, NULLCHAR, NULL, NULL },
  145. #endif
  146.  
  147. #ifdef    ETHER                    /* ARP_ETHER */
  148.     { EADDR_LEN, IP_TYPE, ARP_TYPE, REVARP_TYPE, 1, (char *) Ether_bdcst, pether, gether },
  149. #else
  150.     { 0, 0, 0, 0, 0, NULLCHAR, NULL, NULL },
  151. #endif
  152.  
  153.     { 0, 0, 0, 0, 0, NULLCHAR, NULL, NULL },/* ARP_EETHER */
  154.  
  155. #ifdef    AX25                    /* ARP_AX25 */
  156.     { AXALEN, PID_IP, PID_ARP, PID_RARP, 10, Ax25multi[0], pax25, setcall },
  157. #else
  158.     { 0, 0, 0, 0, 0, NULLCHAR, NULL, NULL },
  159. #endif
  160.     { 0, 0, 0, 0, 0, NULLCHAR, NULL, NULL },/* ARP_PRONET */
  161.     { 0, 0, 0, 0, 0, NULLCHAR, NULL, NULL },/* ARP_CHAOS */
  162.     { 0, 0, 0, 0, 0, NULLCHAR, NULL, NULL },/* ARP_IEEE802 */
  163.  
  164. #ifdef    ARCNET                    /* ARP_ARCNET */
  165.     { AADDR_LEN, ARC_IP, ARC_ARP, 0, 1, ARC_bdcst, parc, garc },
  166. #else
  167.     { 0, 0, 0, 0, 0, NULLCHAR, NULL, NULL },
  168. #endif
  169.  
  170.     { 0, 0, 0, 0, 0, NULLCHAR, NULL, NULL },/* ARP_APPLETALK */
  171. };
  172.  
  173.  
  174. #ifdef    AX25
  175. /* Linkage to network protocols atop ax25 */
  176. struct axlink Axlink[] =
  177. {
  178.     { PID_IP,    axip },
  179.     { PID_ARP,    axarp },
  180. #ifdef RARP
  181.     { PID_RARP,    axrarp },
  182. #endif
  183. #ifdef  NETROM
  184.     { PID_NETROM,    axnr },
  185. #endif
  186.     { PID_NO_L3,    axnl3 },
  187.     { 0,        NULL }
  188. };
  189. #endif
  190.  
  191.  
  192.  
  193. #ifdef  MAILCLIENT
  194. struct daemon Mailreaders[] =
  195. {
  196. #ifdef    POP2CLIENT
  197.     { "POP2",    2048,    pop2_job },
  198. #endif
  199. #ifdef  POP3CLIENT
  200.     { "POP3",    2048,    pop3_job },
  201. #endif
  202.     { NULLCHAR,    0,    NULL }
  203. };
  204. #endif
  205.  
  206.  
  207. #ifndef BOOTP
  208. int WantBootp = 0;
  209.  
  210. int
  211. bootp_validPacket (struct ip *ip OPTIONAL, struct mbuf **bpp OPTIONAL)
  212. {
  213.     return 0;
  214. }
  215. #endif
  216.  
  217.  
  218.  
  219. #ifdef    MAILBOX
  220. void (*Listusers) (int s) = listusers;
  221. #else
  222. void (*Listusers) (int s) = NULL;
  223. #endif
  224.  
  225.  
  226. /* daemons to be run at startup time */
  227. struct daemon Daemons[] =
  228. {
  229.     { "killer",        1024,    killer },
  230.     { "timer",        1024,    timerproc },
  231.     { "network",        3072,    network },
  232.     { "keyboard",        1024,    keyboard },
  233.     { "screendaemon",    512,    screendaemon },
  234. #ifdef STATS
  235.     { "statsdaemon",    768,    statsdaemon },
  236. #endif
  237. #if !defined(TNOS_68K) && !defined(UNIX)
  238.     { "gcollect",        512,    gcollect },
  239. #endif
  240.     { NULLCHAR,         0,    NULLVFP ((int, void *, void *)) }
  241. };
  242.  
  243.  
  244.  
  245. struct iftype Iftypes[] =
  246. {
  247. /* This entry must be first, since Loopback refers to it */
  248.     { "None", NULL, NULL, NULL, NULL, CL_NONE, 0 },
  249.  
  250. #ifdef    AX25
  251.     { "AX25", ax_send, ax_output, pax25, setcall, CL_AX25, AXALEN },
  252. #endif
  253.  
  254. #ifdef    SLIP
  255.     { "SLIP", slip_send, NULL, NULL, NULL, CL_NONE, 0 },
  256. #endif
  257.  
  258. #ifdef    ETHER
  259. /* Note: NULL is specified for the scan function even though
  260.      * gether() exists because the packet drivers don't support
  261.      * address setting.
  262.      */
  263.     { "Ethernet", enet_send, enet_output, pether, NULL, CL_ETHERNET, EADDR_LEN },
  264. #endif
  265.  
  266. #ifdef    NETROM
  267.     { "NETROM", nr_send, NULL, pax25, setcall, CL_NETROM, AXALEN },
  268. #endif
  269.  
  270. #ifdef    SLFP
  271.     { "SLFP", pk_send, NULL, NULL, NULL, CL_NONE, 0 },
  272. #endif
  273.  
  274. #ifdef    PPP
  275.     { "PPP", ppp_send, ppp_output, NULL, NULL, CL_PPP, 0 },
  276. #endif
  277.  
  278.     { NULLCHAR, NULL, NULL, NULL, NULL, CL_NONE, 0 }
  279. };
  280.  
  281.  
  282.  
  283.  
  284. /* Command lookup and branch tables */
  285. struct cmds Cmds[] =
  286. {
  287. /* The "go" command must be first */
  288.     { "",        go,        0,    0,    NULLCHAR },
  289.     { "?",        dohelp,        0,    0,    NULLCHAR },
  290. #ifdef SHELL
  291.     { "!",        doshell,    0,    0,    NULLCHAR },
  292. #endif
  293. #ifdef ALLSESSIONS
  294.     { "abort",    doabort,    0,    0,    NULLCHAR },
  295. #endif
  296. #ifdef SCRIPTING
  297.     { "alias",    doalias,    0,    0,    NULLCHAR },
  298. #endif
  299. #if defined(AX25) || defined(ETHER)
  300.     { "arp",    doarp,        0,    0,    NULLCHAR },
  301. #endif
  302. #ifdef ASY
  303. #ifdef UNIX
  304.     { "asyconfig",    doasyconfig,    0,    2,    "asyconfig <iface> <parameter>" },
  305. #endif
  306.     { "asystat",    doasystat,    0,    0,    NULLCHAR },
  307. #endif
  308. #ifdef ATCMD
  309.     { "at",        doat,        0,    0,    NULLCHAR },
  310. #endif
  311.     { "attach",    doattach,    0,    2,    "attach <hardware> <hw specific options>" },
  312. #ifdef AX25
  313. #ifdef AUTOROUTE
  314.     { "autoroute",    doax25autoroute,0,    0,    NULLCHAR },
  315. #endif
  316.     { "ax25",    doax25,        0,    0,    NULLCHAR },
  317. #ifdef AXUI
  318.     { "axui",    doaxui,        1024,    2,    "axui <interface> [callsign]" },
  319. #endif
  320. #endif /* AX25 */
  321. #ifdef    MAILBOX
  322.     { "bbs",    dobbs,        2048,    0,    NULLCHAR },
  323. #endif
  324. #ifdef EXPIRY
  325.     { "bid",    dooldbids,    0,    0,    NULLCHAR },
  326. #endif
  327. #ifdef    BOOTPCLIENT
  328.     { "bootp",    dobootp,    0,    0,    NULLCHAR },
  329. #endif
  330. #ifdef BOOTPSERVER
  331.     { "bootpd",    bootpdcmd,    0,    0,    NULLCHAR },
  332. #endif
  333. #ifdef BROWSER
  334.     { "browser",    dobrowser,    1024,    2,    "browser <url>" },
  335.     { "browsercheck", dobrowsercheck, 0,    3,    "browsercheck <timeout> <complete url>" },
  336.     { "browseremail", dobrowseremail, 0,    0,    NULLCHAR },
  337. #endif
  338. #ifdef RLINE
  339.     { "bulletin",    dombrline,    0,    0,    NULLCHAR },
  340. #endif
  341. /* This one is out of alpabetical order to allow abbreviation to "c" */
  342. #if defined(AX25) && defined(ALLSESSIONS)
  343.     { "connect",    doconnect,    1024,    3,    "connect <interface> <callsign>" },
  344. #endif
  345. #ifdef CALLBOOK
  346.     { "callserver",    doinetcallserver,0,    0,    NULLCHAR },
  347. #endif
  348. #if defined(CALLCLI) || defined(SAMCALLB) || defined(QRZCALLB)
  349.     { "callbook",    docallbook,    1024,    2,    "callbook CALLSIGN" },
  350.     { "callserver2",docallserver,    0,    0,    NULLCHAR },
  351. #endif
  352. #ifdef ALLCMD
  353.     { "cd",        docd,        0,    0,    NULLCHAR },
  354. #endif
  355. #ifdef CALLSERVER
  356.     { "cdrom",    docdrom,    0,    0,    NULLCHAR },
  357. #endif
  358. #ifdef ALLSERV
  359.     { "chat",    chatcmd,    0,    0,    NULLCHAR },
  360. #endif
  361. #if defined(ALLCMD) && defined(TNOS_68K)
  362.     { "chd",    docd,        0,    0,    NULLCHAR },
  363. #endif
  364.     { "close",    doclose,    0,    0,    NULLCHAR },
  365.     { "cls",    (int (*)(int, char **, void *)) clrscr,
  366.                     0,    0,    NULLCHAR },
  367.     { "color",    docolor,    0,    3,    "color <background> <foreground>" },
  368. #ifdef ASY
  369.     { "comm",    doasycomm,    0,    3,    "comm <interface> <text-string>" },
  370. #endif
  371. #if defined(ALLSESSIONS) && defined(CONVERS)
  372.     { "conference",    doconf,        1024,    0,    NULLCHAR },
  373.     { "convers",    doconvers,    0,    0,    NULLCHAR },
  374. #endif
  375. #ifdef ALLCMD
  376.     { "copy",    docopy,        0,    3,    "copy <file> <newfile>" },
  377. #endif
  378. #if defined(BETA) && defined(ALPHATEST)    /* not for production usage - diagnostic only */
  379.     { "crashprotect", docrashprot,    0,     0,     NULLCHAR },
  380. #endif
  381. #ifdef CRONTAB
  382.     { "crontab",    docrontab,    0,    0,    NULLCHAR },
  383. #endif
  384. /* This one is out of alpabetical order to allow abbreviation to "d" */
  385. #ifdef ALLSESSIONS
  386.     { "disconnect",    doclose,    0,    0,    NULLCHAR },
  387. #endif
  388. #ifdef SCRIPTING
  389.     { "decr",    dodecr,        0,    2,    "decr <variable> [offset]" },
  390. #endif
  391. #if defined(ALLCMD) && defined(TNOS_68K)
  392.     { "deldir",    dormd,        0,    2,    "deldir <directory>" },
  393. #endif
  394. #ifdef ALLCMD
  395.     { "delete",    dodelete,    0,    2,    "delete <file>" },
  396. #endif
  397.     { "detach",    dodetach,    0,    2,    "detach <interface>" },
  398. #ifdef    DIALER
  399.     { "dialer",    dodialer,    512,    2,    "dialer <iface> [<file> [<seconds> [<pings> [<hostid>]]]]" },
  400. #endif
  401. #ifdef ALLCMD
  402.     { "dir",    dodir,        0,    0,    NULLCHAR },
  403. #endif
  404.     { "domain",    dodomain,    0,    0,    NULLCHAR },
  405. #ifdef    DRSI
  406.     { "drsistat",    dodrstat,    0,    0,    NULLCHAR },
  407. #endif
  408. #if defined(ALLCMD) && !defined(UNIX)
  409.     { "dump",    domdump,    0,    0,    NULLCHAR },
  410. #endif
  411. #ifdef SCRIPTING
  412.     { "echo",    doecho,        0,    0,    NULLCHAR },
  413. #endif
  414. #ifdef    EAGLE
  415.     { "eaglestat",    doegstat,    0,    0,    NULLCHAR },
  416. #endif
  417.     { "echomode",    doechomode,    0,    0,    NULLCHAR },
  418. #ifdef SCRIPTING
  419.     { "else",    doelse,        0,    2,    "else \"cmd\"" },
  420. #endif
  421.     { "eol",    doeol,        0,    0,    NULLCHAR },
  422.     { "errors",    doerror,    0,    0,    NULLCHAR },
  423. #ifdef ESCAPE
  424.     { "escape",    doescape,    0,    0,    NULLCHAR },
  425. #endif
  426. #ifdef    PC_EC
  427.     { "etherstat",    doetherstat,    0,    0,    NULLCHAR },
  428. #endif
  429.     { "exit",    doexit,        0,    0,    NULLCHAR },
  430. #ifdef EXPIRY
  431.     { "expire",    doexpire,    0,    0,    NULLCHAR },
  432. #endif
  433. #ifdef BBSIMPORT
  434.     { "export",    doexport,    0,    0,    NULLCHAR },
  435. #endif
  436. #ifdef ALLCMD
  437.     { "finger",    dofinger,    1024,    2,    "finger name@host" },
  438. #ifdef MSDOS
  439.     { "fkey",    dofkey,        0,    0,    NULLCHAR },
  440. #endif
  441. #ifdef MBFWD
  442.     { "forward",    doforward,    0,    0,    NULLCHAR },
  443. #endif
  444. #endif
  445. #ifdef SCRIPTING
  446.     { "foreach",    doforeach,    0,    4,    "foreach <variable> \"list\" \"cmd\"" },
  447. #endif
  448. #ifdef FORTH
  449.     { "forth",    doforth,    0,    0,    NULLCHAR },
  450. #endif
  451.     { "fstat",    dofstat,    0,    0,    NULLCHAR },
  452. #ifdef ALLSESSIONS
  453.     { "ftp",    doftp,        2048,    2,    "ftp <address> [[inputfile] [pause]]" },
  454.     { "ftype",    doftype,    0,    0,    NULLCHAR },
  455. #endif
  456. #ifdef FTPTDISC
  457.     { "ftptdisc",    doftptdisc,    0,    0,    NULLCHAR },
  458. #endif
  459.     { "ftpmaxclients",doftpmaxclients,0,    0,    NULLCHAR },
  460. #ifdef SCRIPTING
  461.     { "gone",    dogone,        0,    0,    NULLCHAR },
  462.     { "goto",    dogoto,        0,    0,    NULLCHAR },
  463. #endif
  464. #ifdef GPS
  465.     { "gps",    dogps,        0,    0,    NULLCHAR },
  466. #endif
  467. #ifdef HAPN
  468.     { "hapnstat",    dohapnstat,    0,    0,    NULLCHAR },
  469. #endif
  470.     { "help",    dohelp,        0,    0,    NULLCHAR },
  471. #ifdef SCRIPTING
  472.     { "here",    dohere,        0,    0,    NULLCHAR },
  473. #endif
  474.     { "history",    dohistory,    0,    0,    NULLCHAR },
  475. #ifdef    HOPCHECK
  476.     { "hop",    dohop,        0,    0,    NULLCHAR },
  477. #endif
  478.     { "hostname",    dohostname,    0,    0,    NULLCHAR },
  479. #ifdef    HS
  480.     { "hs",        dohs,        0,    0,    NULLCHAR },
  481. #endif
  482. #ifdef HTTP
  483.     { "http",    dohttp,        0,    0,    NULLCHAR },
  484. #endif
  485.     { "icmp",    doicmp,        0,    0,    NULLCHAR },
  486. #ifdef SCRIPTING
  487.     { "if",        doif,        0,    0,    NULLCHAR },
  488.     { "ifdef",    doifdef,    0,    3,    "ifdef variable cmd" },
  489.     { "ifndef",    doifndef,    0,    3,    "ifndef variable cmd" },
  490. #endif
  491.     { "ifconfig",    doifconfig,    0,    0,    NULLCHAR },
  492. #ifdef BBSIMPORT
  493.     { "import",    doimport,    0,    0,    NULLCHAR },
  494. #endif
  495. #ifdef SCRIPTING
  496.     { "incr",    doincr,        0,    2,    "incr <variable> [offset]" },
  497. #endif
  498. #ifdef TUTOR
  499.     { "info",    doinfo,        512,    0,    NULLCHAR },
  500. #endif
  501.     { "ip",        doip,        0,    0,    NULLCHAR },
  502.     { "kick",    dokick,        0,    0,    NULLCHAR },
  503.     { "kstat",    dokstat,    0,    0,    NULLCHAR },
  504. /* next one deliberately out of order to make 'lock' shortcut to 'l' */
  505. #ifdef LOCK
  506.     { "lock",    dolock,        0,    0,    NULLCHAR },
  507. #endif
  508. #ifdef SCRIPTING
  509.     { "label",    dolabel,    0,    0,    NULLCHAR },
  510. #endif
  511.     { "log",    dolog,        0,    0,    NULLCHAR },
  512. #ifdef LOOKSESSION
  513.     { "look",    dolook,        1024,    2,    "look <user|sock#>" },
  514. #endif
  515. #ifdef ALLCMD
  516.     { "ls",        dodir,        0,    0,    NULLCHAR },
  517. #endif
  518. #ifdef LZW
  519.     { "lzw",    dolzw,        0,    2,    "lzw <mode|bits>" },
  520. #endif
  521. #if defined(ALLCMD) && !defined(UNIX)
  522.     { "mail",    dobmail,    0,    0,    NULLCHAR },
  523. #endif
  524. #if defined(ALLCMD) && defined(TNOS_68K)
  525.     { "makdir",    domkd,        0,    2,    "makdir <directory>" },
  526. #endif
  527.     { "man",    doman,        0,    2,    "man [section] topic" },
  528. #ifdef ALLCMD
  529.     { "md",        domkd,        0,    2,    "md <directory>" },
  530. #endif
  531. #ifdef MSDOS
  532.     { "memory",    domem,        0,    0,    NULLCHAR },
  533. #endif
  534. #ifdef ALLCMD
  535.     { "mkdir",    domkd,        0,    2,    "mkdir <directory>" },
  536. #endif
  537. #ifdef  AX25
  538.     { "mode",    domode,        0,    2,    "mode <interface>" },
  539. #endif
  540. #ifdef ALLCMD
  541.     { "more",    domore,        0,    2,
  542.      "more <filename> [searchstring]" },
  543.     { "motd",    domotd,        0,    0,    NULLCHAR },
  544. #endif
  545. #ifdef    NETROM
  546.     { "netrom",    donetrom,    0,    0,    NULLCHAR },
  547. #endif /* NETROM */
  548. #ifdef TUTOR
  549.     { "news",    donews,        512,    0,    NULLCHAR },
  550. #endif
  551. #if defined(NNTP) || defined(NNTPS)
  552.     { "nntp",    donntp,        0,    0,    NULLCHAR },
  553. #endif
  554. #ifdef NODECALL
  555.     { "node",    donode,        0,    0,    NULLCHAR },
  556. #endif
  557. #ifdef NRS
  558.     { "nrstat",    donrstat,    0,    0,    NULLCHAR },
  559. #endif
  560. #ifdef  MAILBOX
  561.     { "pbbs",    dopbbs,        0,    0,    NULLCHAR },
  562. #endif
  563.     { "param",    doparam,    0,    2,    "param <interface>" },
  564. #ifdef SCRIPTING
  565.     { "pause",    dopause,    0,    0,    NULLCHAR },
  566. #endif
  567.     { "ping",    doping,        0,    2,
  568.      "ping <hostid> [<length> [<interval> [incflag]]]" },
  569. #ifdef PIPECMD
  570.     { "pipe",    dopipe,        0,    2,    "pipe cmdname" },
  571. #endif
  572. #ifdef    PI
  573.     { "pistatus",    dopistat,    0,    0,    NULLCHAR },
  574. #endif
  575. #ifdef    POP
  576.     { "pop",    dopop,        0,    0,    NULLCHAR },
  577. #endif
  578. #ifdef  MAILCLIENT
  579.     { "popmail",    domsread,    0,    0,    NULLCHAR },
  580. #endif
  581. #ifdef GPS
  582.     { "position",    doposition,    0,    0,    NULLCHAR },
  583. #endif
  584. #ifdef PPP
  585.     { "ppp",    doppp_commands,    0,    0,    NULLCHAR },
  586. #endif
  587.     { "profile",    doprofile,    0,    0,    NULLCHAR },
  588.     { "prompt",    doprompt,    0,    0,    NULLCHAR },
  589.     { "ps",        ps,        0,    0,    NULLCHAR },
  590. #ifndef UNIX
  591. #ifdef ALLCMD
  592.     { "pwd",    docd,        0,    0,    NULLCHAR },
  593. #endif
  594. #endif
  595.     { "quit",    doexit,        0,    0,    NULLCHAR },
  596.     { "quote",    doquote,    1024,    0,    NULLCHAR },
  597. #if defined(AX25) || defined(ETHER)
  598. #ifdef RARP
  599.     { "rarp",    dorarp,        0,    0,    NULLCHAR },
  600. #endif /* RARP */
  601. #endif
  602. #ifdef ALLCMD
  603.     { "rd",        dormd,        0,    2,    "rd <directory>" },
  604. #endif
  605. #ifdef  RDATE
  606.     { "rdate",    dordate,    0,    0,    NULLCHAR },
  607. #endif
  608. #ifdef ALLCMD
  609.     { "record",    dorecord,    0,    0,    NULLCHAR },
  610. #endif
  611.     { "register",    doregister,    0,    0,    NULLCHAR },
  612.     { "remote",    doremote,    0,    3,    /*lint -save -e786 */
  613.     "remote [-p <port#>] [-a <kickaddress>] <hostname> kickme\n"
  614.     "   or: remote [-p <port#>] -k <key> <hostname> reset|exit\n"
  615.     "   or: remote [-p <port#>] -k <key> -r <destIPaddr>[/<bits>] <hostname> add|drop\n"
  616.     "   or: remote -s <password>\n   or: remote -g <gatewaypassword>" },    /*lint -restore */
  617. #ifdef ALLCMD
  618.     { "rename",    dorename,    0,    3,    "rename <oldfile> <newfile>" },
  619. #endif
  620.     { "repeat",    dorepeat,    512,    3,    "repeat [<interval>] <command> [args...]" },
  621.     { "reset",    doreset,    0,    0,    NULLCHAR },
  622. #ifdef    RIP
  623.     { "rip",    dorip,        0,    0,    NULLCHAR },
  624. #endif
  625. #if defined(RLOGINCLI) || defined(RLOGINSERV)
  626.     { "rlogin",    dorlogin,    2048,    2,    "rlogin <address>" },
  627. #endif
  628. #ifdef ALLCMD
  629.     { "rm",        dodelete,    0,    2,    "rm <file>" },
  630.     { "rmdir",    dormd,        0,    2,    "rmdir <directory>" },
  631. #endif
  632.     { "route",    doroute,    0,    0,    NULLCHAR },
  633. #ifdef    RSPF
  634.     { "rspf",    dorspf,        0,    0,    NULLCHAR },
  635. #endif /* RSPF */
  636.     { "sendmail",    dosendmail,    0,    4,    "sendmail <toaddr> [<fromaddr>] subj data\n\twhere 'data' is a string or <filename" },
  637.     { "session",    dosession,    0,    0,    NULLCHAR },
  638.     { "security",    dosecurity,    0,    0,    NULLCHAR },
  639. #ifdef UNIX
  640.     { "sessmgr",    dosessmgr,    0,    0,    NULLCHAR },
  641. #endif
  642. #ifdef SCRIPTING
  643.     { "set",    doset,        0,    0,    NULLCHAR },
  644. #endif
  645. #ifdef    SCC
  646.     { "sccstat",    dosccstat,    0,    0,    NULLCHAR },
  647. #endif
  648. #ifdef TUTOR
  649.     { "script",    doscript,    0,    2,    "script <filename>" },
  650. #endif
  651. #ifdef SHELL
  652.     { "shell",    doshell,    0,    0,    NULLCHAR },
  653. #endif
  654.     { "shutdown",    doshutdown,    256,    3,    "shutdown <delay | \"now\"> \"reason\"" },
  655.     { "skick",    dokicksocket,    0,    2,    "skick <socket#>" },
  656. #ifdef SCRIPTING
  657.     { "sleep",    dosleep,    0,    0,    NULLCHAR },
  658. #endif
  659.     { "smtp",    dosmtp,        0,    0,    NULLCHAR },
  660.     { "socket",    dosock,        0,    0,    NULLCHAR },
  661. /* this next line deliberately out of order */
  662.     { "source",    dosource,    0,    2,    "source <filename>" },
  663. #ifdef SOUNDS
  664.     { "sounds",    dosounds,    0,    0,    NULLCHAR },
  665. #endif
  666. #if defined(AX25) && defined(ALLSESSIONS) && defined(ALLSERV)
  667.     { "split",    doconnect,    1024,    3,    "split <interface> <callsign>" },
  668. #endif
  669. #ifdef SQL
  670.     { "sql",    dosql,        0,    0,    NULLCHAR },
  671. #endif
  672.     { "sreset",    doresetsocket,    0,    2,    "sreset <socket#>" },
  673. #ifdef SCREENSAVER
  674.     { "ssaver",    dossaver,    0,    0,    NULLCHAR },
  675. #endif
  676. #ifdef    SERVERS
  677.     { "start",    dostart,    0,    2,    "start <servername>" },
  678. #endif
  679.     { "statline",    dostatline,    0,    0,    NULLCHAR },
  680.     { "statmode",    dostatmode,    0,    0,    NULLCHAR },
  681. #ifdef STATS
  682.     { "stats",    dostats,    0,    0,    NULLCHAR },
  683. #endif
  684.     { "status",    dostatus,    0,    0,    NULLCHAR },
  685. #ifdef    SERVERS
  686.     { "stop",    dostop,        0,    2,    "stop <servername>" },
  687. #endif
  688. #ifdef  TRACE
  689.     { "strace",    dostrace,    0,    0,    NULLCHAR },
  690. #endif
  691. #ifdef ALLSESSIONS        /* deliberately out of order to be first */
  692.     { "telnet",    dotelnet,    1024,    2,    "telnet <address> [port]" },
  693. #endif
  694. #ifdef TERMSERVER
  695.     { "term",    doterm,        256,    0,    NULLCHAR },
  696. #endif
  697. #ifdef ALLCMD
  698.     { "tail",    dotail,        0,    2,    "tail <filename> [lines]" },
  699. #endif
  700.     { "tcp",    dotcp,        0,    0,    NULLCHAR },
  701. #ifdef  MAILBOX
  702.     { "thirdparty",    dothirdparty,    0,    0,    NULLCHAR },
  703. #endif
  704.     { "time",    dosystime,    0,    0,    NULLCHAR },
  705.     { "timers",    dotimers,    0,    0,    NULLCHAR },
  706.     { "tip",    dotip,        0,    2,    "tip <iface (asyc only!)>" },
  707. #ifdef  TRACE
  708.     { "trace",    dotrace,    0,    0,    NULLCHAR },
  709. #endif
  710. #ifdef ALLSERV
  711.     { "ttylink",    dotelnet,    1024,    2,    "ttylink <address> [port]" },
  712. #endif
  713. #ifdef TUTOR
  714.     { "tutor",    dotutor,    512,    0,    NULLCHAR },
  715. #endif
  716.     { "udp",    doudp,        0,    0,    NULLCHAR },
  717. #ifdef SCRIPTING
  718.     { "unalias",    dounalias,    0,    0,    NULLCHAR },
  719. #endif
  720. #ifdef LOCK
  721.     { "unlock",    dounlock,    0,    0,    NULLCHAR },
  722. #endif
  723. #ifdef SCRIPTING
  724.     { "unset",    dounset,    0,    2,    "unset <variable>" },
  725.     { "until",    dountil,    0,    0,    NULLCHAR },
  726. #endif
  727. #ifdef ALLCMD
  728.     { "upload",    doupload,    0,    0,    NULLCHAR },
  729. #endif
  730.     { "uptime",    douptime,    0,    0,    NULLCHAR },
  731. /* This one is out of alpabetical order to allow abbreviation to "v" */
  732.     { "view",    doview,        0,    2,    "view <filename>" },
  733. #if defined(ALLCMD) || defined(VERSION_ON_FILE)
  734.     { "version",    doversion,    0,    0,    NULLCHAR },
  735. #endif
  736.     { "warnings",    dowarnings,    0,    0,    NULLCHAR },
  737. #ifdef SCRIPTING
  738.     { "while",    dowhile,    0,    0,    NULLCHAR },
  739. #endif
  740. #if defined(EXPIRY) && defined(WPAGES)
  741.     { "wpages",    dooldwpages,    0,    0,    NULLCHAR },
  742. #endif
  743.     { "write",    dowrite,    256,    3,    "write <user|sock#> <msg>" },
  744.     { "writeall",    dowriteall,    256,    2,    "writeall <msg>" },
  745. #ifdef XSERVER
  746.     { "xwindows",    doxwindows,    0,    0,    NULLCHAR },
  747. #endif
  748. #ifdef MSDOS
  749. /* All commands from here to the end aren't displayed in help screen */
  750.     { "a:",        dodrive,    0,    0,    NULLCHAR },
  751.     { "b:",        dodrive,    0,    0,    NULLCHAR },
  752.     { "c:",        dodrive,    0,    0,    NULLCHAR },
  753.     { "d:",        dodrive,    0,    0,    NULLCHAR },
  754.     { "e:",        dodrive,    0,    0,    NULLCHAR },
  755.     { "f:",        dodrive,    0,    0,    NULLCHAR },
  756.     { "g:",        dodrive,    0,    0,    NULLCHAR },
  757. /* other drive can be added also.... */
  758. #endif
  759.     { NULLCHAR,    NULLFP ((int, char **, void *)),
  760.                     0,    0,    "Unknown command; type \"?\" for list" }
  761. };
  762.  
  763.  
  764.  
  765. /*lint -save -e786 */
  766. /* List of supported hardware devices */
  767. struct cmds Attab[] =
  768. {
  769. #ifdef    PC_EC
  770. /* 3-Com Ethernet interface */
  771.     { "3c500", ec_attach, 0, 7, "attach 3c500 <address> <vector> arpa <label> <buffers> <mtu> [ip_addr]" },
  772. #endif
  773. #ifdef    ASY
  774. /* Ordinary PC asynchronous adaptor */
  775.     { "asy", asy_attach, 0, 8, "attach asy <address> <vector> "
  776. #ifdef SLIP
  777.         "slip"
  778. #endif
  779. #ifdef AX25
  780. #ifdef SLIP
  781.         "|"
  782. #endif
  783.         "ax25"
  784. #endif
  785. #ifdef NRS
  786. #if ((defined SLIP) || (defined AX25))
  787.         "|"
  788. #endif
  789.         "nrs"
  790. #endif
  791. #ifdef POLLEDKISS
  792. #if ((defined SLIP) || (defined AX25) || (defined NRS))
  793.         "|"
  794. #endif
  795.         "pkiss"
  796. #endif
  797. #ifdef PPP
  798. #if ((defined SLIP) || (defined AX25) || (defined NRS) || (defined POLLEDKISS))
  799.         "|"
  800. #endif
  801.         "ppp"
  802. #endif
  803.  
  804.         " <label> <bufsize> <mtu> <speed> [options]" },
  805. #endif /* ASY */
  806.  
  807. #ifdef KISS
  808.     /* fake ax25 loopback interface */
  809.     { "axloop", axloop_attach, 0, 1, "attach axloop" },
  810. #endif
  811.  
  812. #ifdef AXIP
  813.     { "axip", axip_attach, 0, 4, "attach axip <name> <mtu> <remote-hostid> [callsign] [rmtcall]" },
  814. #endif
  815.  
  816. #ifdef    DRSI
  817. /* DRSI PCPA card in low speed mode */
  818.     { "drsi", dr_attach, 0, 8, "attach drsi <address> <vector> ax25 <label> <bufsize> <mtu> <chan a speed> <chan b speed> [ip addr a] [ip addr b]" },
  819. #endif
  820.  
  821. /* dummy interfaces */
  822.     { "dummy", dummy_attach, 0, 3, "attach dummy <label> <ip_addr>" },
  823.  
  824. #ifdef    EAGLE
  825. /* EAGLE RS-232C 8530 HDLC adaptor */
  826.     { "eagle", eg_attach, 0, 8, "attach eagle <address> <vector> ax25 <label> <buffers> <mtu> <speed> [ip_addra] [ip_addrb]" },
  827. #endif
  828. #ifdef    HAPN
  829. /* Hamilton Area Packet Radio (HAPN) 8273 HDLC adaptor */
  830.     { "hapn", hapn_attach, 0, 8, "attach hapn <address> <vector> ax25 <label> <rx bufsize> <mtu> csma|full [ip_addr]" },
  831. #endif
  832.  
  833. #ifdef    HS
  834. /* Special high speed driver for DRSI PCPA or Eagle cards */
  835.     { "hs", hs_attach, 0, 7, "attach hs <address> <vector> ax25 <label> <buffers> <mtu> <txdelay> <persistence> [ip_addra] [ip_addrb]" },
  836. #endif
  837.  
  838. #ifdef linux
  839.     { "kernel", krnlif_attach, 0, 2, "attach kernel <iface> [nopromisc]" },
  840. #endif
  841.  
  842. #ifdef    KISS
  843. /* Multi-port KISS interfaer piggy-backing on ASY interface. */
  844.     { "kiss", kiss_attach, 0, 4, "attach kiss <asy_interface_label> <port> <label> [mtu]" },
  845. #endif /* KISS */
  846.  
  847. #ifdef NETROM
  848. /* fake netrom interface */
  849.     { "netrom", nr_attach, 0, 1, "attach netrom [ip_addr]" },
  850. #endif
  851.  
  852. #ifdef    PACKET
  853. /* FTP Software's packet driver spec */
  854.     { "packet", pk_attach, 0, 4, "attach packet <int#> <label> <buffers_in_kb> <mtu> [ip_addr]" },
  855. #endif
  856.  
  857. #ifdef    PC100
  858. /* PACCOMM PC-100 8530 HDLC adaptor */
  859.     { "pc100", pc_attach, 0, 8, "attach pc100 <address> <vector> ax25 <label> <buffers> <mtu> <speed> [ip_addra] [ip_addrb]" },
  860. #endif
  861.  
  862. #ifdef    PI
  863. /* Special high speed driver for PI 8530 HDLC adapter */
  864.     { "pi", pi_attach, 0, 8, "attach pi <address> <vector> <dmachannel> ax25 <label> <buffers> <mtu> <speed a> <speed b> [ip_addra] [ip_addrb]" },
  865. #endif
  866.  
  867. #ifdef SCC
  868.     { "scc", scc_attach, 0, 7, "attach scc <devices> init <addr> <spacing> <Aoff> <Boff> <Dataoff>\n   <intack> <vec> [p]<clock> [hdwe] [param]\n"
  869.         "attach scc <chan> slip|kiss|nrs|ax25 <label> <mtu> <speed> <bufsize> [call]" },
  870. #endif
  871.     { NULLCHAR, NULL, 0, 4, NULLCHAR }
  872. };
  873. /*lint -restore */
  874.  
  875.  
  876.  
  877. /* Functions to be called on each clock tick */
  878. void (*Cfunc[]) (void) = {
  879. #ifndef UNIX
  880.     pctick,            /* Call PC-specific stuff to keep time */
  881.     kbint,            /* Necessary because there's no hardware keyboard interrupt */
  882. #ifdef ASY
  883.     asytimer,
  884. #endif
  885. #ifdef    SCC
  886.     scctimer,
  887. #endif
  888. #endif
  889.     axsetupflush,
  890.     sesflush,
  891.     NULL,
  892. };
  893.  
  894.  
  895.  
  896. #ifdef MSDOS
  897. /* Entry points for garbage collection */
  898. void (*Gcollect[]) (int) = {
  899.     tcp_garbage,
  900.     ip_garbage,
  901.     udp_garbage,
  902.     st_garbage,
  903. #ifdef    AX25
  904.     lapb_garbage,
  905. #endif
  906. #ifdef    NETROM
  907.     nr_garbage,
  908. #endif
  909.     NULL
  910. };
  911. #endif
  912.  
  913.  
  914. #ifndef UNIX
  915. /* Functions to be called at shutdown */
  916. void (*Shutdown[]) (void) = {
  917. #ifdef SCC
  918.     sccstop,
  919. #endif
  920.     NULLVFP ((void)),
  921. };
  922. #endif
  923.  
  924.  
  925.  
  926. /* Packet tracing stuff */
  927. #ifdef    TRACE
  928.  
  929. /* #ifdef MONITOR
  930.  * #define NULLMONFP NULLVFP((FILE *,struct mbuf **, int, int))
  931.  * #else
  932.  */
  933. #define NULLMONFP NULLVFP((FILE *,struct mbuf **, int))
  934. /* #endif */
  935.  
  936. /* Protocol tracing function pointers. Matches list of class definitions
  937.  * in pktdrvr.h.
  938.  */
  939. struct trace Tracef[] =
  940. {
  941.     { NULLFP ((struct iface *, struct mbuf *)), ip_dump },    /* CL_NONE */
  942.  
  943. #ifdef    ETHER                            /* CL_ETHERNET */
  944.     { ether_forus, ether_dump },
  945. #else
  946.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },
  947. #endif /* ETHER */
  948.  
  949.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },/* CL_PRONET_10 */
  950.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },/* CL_IEEE8025 */
  951.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },/* CL_OMNINET */
  952.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },/* CL_APPLETALK */
  953.  
  954. #ifdef VJCOMPRESS
  955.     { NULLFP ((struct iface *, struct mbuf *)), sl_dump },    /* CL_SERIAL_LINE */
  956. #else
  957.     { NULLFP ((struct iface *, struct mbuf *)), ip_dump },    /* CL_SERIAL_LINE */
  958. #endif
  959.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },/* CL_STARLAN */
  960.  
  961. #ifdef    ARCNET
  962.     { arc_forus, arc_dump },                /* CL_ARCNET */
  963. #else
  964.     {NULLFP ((struct iface *, struct mbuf *)), NULLMONFP},
  965. #endif /* ARCNET */
  966.  
  967. #ifdef    AX25                            /* CL_AX25 */
  968.     { ax_forus, ax25_dump },
  969. #else
  970.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },
  971. #endif /* AX25 */
  972.  
  973. #ifdef    KISS                            /* CL_KISS */
  974.     { ki_forus, ki_dump },
  975. #else
  976.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },
  977. #endif /* KISS */
  978.  
  979.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },/* CL_IEEE8023 */
  980.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },/* CL_FDDI */
  981.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },/* CL_INTERNET_X25 */
  982.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },/* CL_LANSTAR */
  983. #ifdef    SLFP                            /* CL_SLFP */
  984.     { NULLFP ((struct iface *, struct mbuf *)), ip_dump },
  985. #else
  986.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },
  987. #endif /* SLFP */
  988.  
  989. #ifdef    NETROM                            /* CL_NETROM */
  990.     { NULLFP ((struct iface *, struct mbuf *)), ip_dump },
  991. #else
  992.     { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },
  993. #endif
  994.  
  995. #ifdef PPP                            /* CL_PPP */
  996.         { NULLFP ((struct iface *, struct mbuf *)), ppp_dump },
  997. #else
  998.         { NULLFP ((struct iface *, struct mbuf *)), NULLMONFP },
  999. #endif /* PPP */
  1000. };
  1001.  
  1002. #else
  1003.  
  1004. /* Stub for packet dump function */
  1005. void
  1006. dump (struct iface *iface, int direction, unsigned type, struct mbuf *bp)
  1007. {
  1008. }
  1009.  
  1010. void
  1011. raw_dump (struct iface *iface, int direction, struct mbuf *bp)
  1012. {
  1013. }
  1014.  
  1015. #endif /* TRACE */
  1016.  
  1017.  
  1018.  
  1019. #ifdef  AX25
  1020. #ifdef AUTOROUTE
  1021. /* G4JEC's automatic ARP & Route resolution code primitive. */
  1022. extern void ax25eavesdrop (struct iface * iface, char *source, char *dest, struct mbuf * bp);
  1023. extern int Ax25_autoroute;
  1024. #endif /* AUTOROUTE */
  1025.  
  1026.  
  1027. /* Hooks for passing incoming AX.25 data frames to network protocols */
  1028. void
  1029. axip (struct iface *iface, struct ax25_cb *axp OPTIONAL, char *src, char *dest, struct mbuf *bp, int mcast)
  1030. {
  1031. #ifdef AUTOROUTE
  1032. struct mbuf *nbp;
  1033.  
  1034.         if (Ax25_autoroute) {
  1035.                 (void) dup_p (&nbp, bp, 0, len_p (bp));
  1036.                 ax25eavesdrop (iface, src, dest, nbp);
  1037.                 free_p (nbp);
  1038.         }
  1039. #endif
  1040.         (void) ip_route (iface, bp, mcast);
  1041. }
  1042.  
  1043.  
  1044. static void
  1045. axarp (struct iface *iface, struct ax25_cb *axp OPTIONAL, char *src OPTIONAL, char *dest OPTIONAL, struct mbuf *bp, int mcast OPTIONAL)
  1046. {
  1047.         arp_input (iface, bp);
  1048. }
  1049.  
  1050.  
  1051. #ifdef RARP
  1052. static void
  1053. axrarp (struct iface *iface, struct ax25_cb *axp OPTIONAL, char *src OPTIONAL, char *dest OPTIONAL, struct mbuf *bp, int mcast OPTIONAL)
  1054. {
  1055.         rarp_input (iface, bp);
  1056. }
  1057.  
  1058. #endif /* RARP */
  1059.  
  1060.  
  1061.  
  1062. #ifdef  NETROM
  1063. static void
  1064. axnr (struct iface *iface, struct ax25_cb *axp, char *src, char *dest OPTIONAL, struct mbuf *bp, int mcast)
  1065. {
  1066.         if (!mcast)
  1067.                 nr_route (bp, axp);
  1068.         else
  1069.                 nr_nodercv (iface, src, bp);
  1070. }
  1071.  
  1072. #endif /* NETROM */
  1073. #endif /* AX25 */
  1074.  
  1075.  
  1076.  
  1077. #ifndef RIP
  1078. void rt_timeout (void *s);
  1079.  
  1080.  
  1081. /* Stub for routing timeout when RIP is not configured -- just remove entry */
  1082. void
  1083. rt_timeout (void *s)
  1084. {
  1085. struct route *stale = (struct route *) s;
  1086.  
  1087.         rt_drop (stale->target, stale->bits);
  1088. }
  1089. #endif
  1090.  
  1091.  
  1092.  
  1093. #ifdef  SERVERS
  1094. /* "start" and "stop" subcommands */
  1095. static struct cmds Startcmds[] =
  1096. {
  1097. #if     defined(AX25) && defined(MAILBOX)
  1098.         { "ax25",       ax25start,      256,    0, NULLCHAR },
  1099. #endif
  1100. #if defined(CALLSERVER) || defined(SAMCALLB) || defined(QRZCALLB)
  1101.         { "callbook",   cdbstart,       256,    0, NULLCHAR },
  1102. #endif
  1103. #ifdef  CONVERS
  1104.         { "convers",    conv1,          384,    0, NULLCHAR },
  1105. #endif
  1106. #ifdef CRONTAB
  1107.         { "cron",       cron1,          384,    0, NULLCHAR },
  1108. #endif
  1109. #ifdef ALLSERV
  1110.         { "daytime",    daytime1,       256,    0, NULLCHAR },
  1111.         { "discard",    dis1,           256,    0, NULLCHAR },
  1112. #ifdef ENCAP
  1113.     { "dynamic",    routecli1,    256,    2, "start dynamic <hostname> [<port>]" },
  1114. #endif
  1115.         { "echo",       echo1,          256,    0, NULLCHAR },
  1116. #endif
  1117. #ifdef MAILBOX
  1118.     { "fbbtelnet",    fbbtelnet1,    256,    0, NULLCHAR },
  1119. #endif /* MAILBOX */
  1120. #ifdef FIFOSERVER
  1121.         { "fifo",       fifo1,          256,    0, NULLCHAR },
  1122. #endif
  1123.         { "finger",     finstart,       256,    0, NULLCHAR },
  1124.         { "ftp",        ftpstart,       256,    0, NULLCHAR },
  1125. #ifdef GPS
  1126.         { "gps",        GPSstart,       256,    2, "start gps <interface>" },
  1127. #endif
  1128. #ifdef HTTP
  1129.         { "http",       httpstart,      256,    0, NULLCHAR },
  1130. #endif
  1131. #ifdef TUTOR
  1132.         { "info",       info1,          256,    0, NULLCHAR },
  1133. #endif
  1134. #ifdef  MESSAGESERVER
  1135.     { "message",    message1,    256,    3, "start message <port> <messagestring> [<ipaddress>]" },
  1136. #endif
  1137. #if     defined(NETROM) && defined(MAILBOX)
  1138.         { "netrom",     nr4start,       256,    0, NULLCHAR },
  1139. #endif
  1140. #ifdef TUTOR
  1141.         { "news",       news1,          256,    0, NULLCHAR },
  1142. #endif
  1143. #ifdef  NNTPS
  1144.         { "nntp",       nntp1,          256,    0, NULLCHAR },
  1145. #endif
  1146. #ifdef  POP
  1147.         { "pop",        pop1,           256,    0, NULLCHAR },
  1148. #endif
  1149. #ifdef  POP2SERVER
  1150.         { "pop2",       pop2start,      2048,   0, NULLCHAR },
  1151. #endif
  1152. #ifdef  POP3SERVER
  1153.         { "pop3",       pop3start,      2048,   0, NULLCHAR },
  1154. #endif
  1155. #ifdef GPS
  1156.         { "position",   POSstart,       256,    0, NULLCHAR },
  1157. #endif
  1158. #ifdef ALLSERV
  1159.         { "quote",      quote1,         256,    0, NULLCHAR },
  1160. #endif
  1161.         { "remote",     rem1,           768,    0, NULLCHAR },
  1162. #ifdef ROUTESERVER
  1163.     { "router",    route1,        256,    0, NULLCHAR },
  1164. #endif
  1165. #ifdef  RIP
  1166.         { "rip",        doripinit,      0,      0, NULLCHAR },
  1167. #endif
  1168. #ifdef RLOGINSERV
  1169.         { "rlogin",     rlogin1,        256,    0, NULLCHAR },
  1170. #endif
  1171.     { "smtp",    smtp1,        512,    0, NULLCHAR },
  1172. #ifdef BROWSER
  1173.     { "statnews",    statnews1,    256,    0, NULLCHAR },
  1174. #endif
  1175. #ifdef TCPGATE    
  1176.     { "tcpgate",    tcpgate1,    256,    3, "start tcpgate <tcp port> <host:service>" },
  1177. #endif
  1178. #ifdef MAILBOX
  1179.     { "telnet",    telnet1,    256,    0, NULLCHAR },
  1180. #endif /* MAILBOX */
  1181. #ifdef TERMSERVER
  1182.     { "term",    term1,        256,    0, NULLCHAR },
  1183. #endif
  1184. #ifdef ALLSERV
  1185.     { "time",    time1,        256,    0, NULLCHAR },
  1186. #endif /* ALLSERV */
  1187. #ifdef TIPMAIL
  1188.     { "tip",    tipstart,    256,    2, "start tip <interface> [<modem|terminal>] [timeout seconds]" },
  1189. #endif /* TIPMAIL */
  1190. #ifdef  TRACESERVER
  1191.     { "trace",    trace1,        256,    0, NULLCHAR },
  1192. #endif
  1193. #ifdef  TSCRIPTSERVER
  1194.     { "tscript",    tscript1,    256,    3, "start tscript <port> <scriptname> [<ipaddress>]" },
  1195. #endif
  1196. #ifdef ALLSERV
  1197.     { "ttylink",    ttylstart,    256,    0, NULLCHAR },
  1198. #endif
  1199. #ifdef TUTOR
  1200.     { "tutor",    tutor1,        256,    0, NULLCHAR },
  1201. #endif
  1202. #ifdef XSERVER
  1203.     { "xserver",    xserver1,    256,    0, NULLCHAR },
  1204. #endif
  1205.     { NULLCHAR,    0,        0,    0, NULLCHAR },
  1206. };
  1207.  
  1208.  
  1209.  
  1210. static struct cmds Stopcmds[] =
  1211. {
  1212. #if    defined(AX25) && defined(MAILBOX)
  1213.     { "ax25",    ax250,        0, 0, NULLCHAR },
  1214. #endif
  1215. #if defined(CALLSERVER) || defined(SAMCALLB) || defined(QRZCALLB)
  1216.     { "callbook",    cdb0,        0, 0, NULLCHAR },
  1217. #endif
  1218. #ifdef  CONVERS
  1219.     { "convers",    conv0,        0, 0, NULLCHAR },
  1220. #endif
  1221. #ifdef CRONTAB
  1222.     { "cron",    cron0,        0, 0, NULLCHAR },
  1223. #endif
  1224. #ifdef ALLSERV
  1225.     { "daytime",    daytime0,    0, 0, NULLCHAR },
  1226.     { "discard",    dis0,        0, 0, NULLCHAR },
  1227. #ifdef ENCAP
  1228.     { "dynamic",    routecli0,    0, 0, NULLCHAR },
  1229. #endif
  1230.     { "echo",    echo0,        0, 0, NULLCHAR },
  1231. #endif
  1232. #ifdef    MAILBOX
  1233.     { "fbbtelnet",    fbbtelnet0,    0, 0, NULLCHAR },
  1234. #endif
  1235. #ifdef FIFOSERVER
  1236.         { "fifo",       fifo0,          0, 0, NULLCHAR },
  1237. #endif
  1238.     { "finger",    fin0,        0, 0, NULLCHAR },
  1239.     { "ftp",    ftp0,        0, 0, NULLCHAR },
  1240. #ifdef GPS
  1241.     { "gps",    GPSstop,    0, 2, "stop gps <interface>" },
  1242. #endif
  1243. #ifdef HTTP
  1244.     { "http",    http0,        0, 0, NULLCHAR },
  1245. #endif
  1246. #ifdef TUTOR
  1247.     { "info",    info0,        0, 0, NULLCHAR },
  1248. #endif
  1249. #ifdef  MESSAGESERVER
  1250.     { "message",    message0,    0, 2, "stop message <port> [<ipaddress>]" },
  1251. #endif
  1252. #if defined(NETROM) && defined(MAILBOX)
  1253.     { "netrom",    nr40,        0, 0, NULLCHAR },
  1254. #endif
  1255. #ifdef TUTOR
  1256.     { "news",    news0,        0, 0, NULLCHAR },
  1257. #endif
  1258. #ifdef    NNTPS
  1259.     { "nntp",    nntp0,        0, 0, NULLCHAR },
  1260. #endif
  1261. #ifdef  POP
  1262.     { "pop",    pop0,        0, 0, NULLCHAR },
  1263. #endif
  1264. #ifdef  POP2SERVER
  1265.     { "pop2",    pop2stop,    0, 0, NULLCHAR },
  1266. #endif
  1267. #ifdef    POP3SERVER
  1268.     { "pop3",    pop3stop,    0, 0, NULLCHAR },
  1269. #endif
  1270. #ifdef GPS
  1271.     { "position",    POSstop,    0, 0, NULLCHAR },
  1272. #endif
  1273. #ifdef ALLSERV
  1274.     { "quote",    quote0,        0, 0, NULLCHAR },
  1275. #endif
  1276.     { "remote",    rem0,        0, 0, NULLCHAR },
  1277. #ifdef ROUTESERVER
  1278.     { "router",    route0,        0, 0, NULLCHAR },
  1279. #endif
  1280. #ifdef  RIP
  1281.     { "rip",    doripstop,    0, 0, NULLCHAR },
  1282. #endif
  1283. #ifdef RLOGINSERV
  1284.     { "rlogin",    rlogin0,     0, 0, NULLCHAR },
  1285. #endif
  1286.     { "smtp",    smtp0,        0, 0, NULLCHAR },
  1287. #ifdef BROWSER
  1288.     { "statnews",    statnews0,    0, 0, NULLCHAR },
  1289. #endif
  1290. #ifdef TCPGATE
  1291.     { "tcpgate",    tcpgate0,    0, 2, "stop tcpgate <tcp port>" },
  1292. #endif
  1293. #ifdef    MAILBOX
  1294.     { "telnet",    telnet0,    0, 0, NULLCHAR },
  1295. #endif
  1296. #ifdef TERMSERVER
  1297.     { "term",    term0,        0, 0, NULLCHAR },
  1298. #endif
  1299. #ifdef ALLSERV
  1300.     { "time",    time0,        0, 0, NULLCHAR },
  1301. #endif
  1302. #ifdef TIPMAIL
  1303.     { "tip",    (int(*)(int,char **,void *))tip0,
  1304.                     0, 2, "stop tip <interface>" },
  1305. #endif
  1306. #ifdef  TRACESERVER
  1307.     { "trace",    trace0,        0, 0, NULLCHAR },
  1308. #endif
  1309. #ifdef  TSCRIPTSERVER
  1310.     { "tscript",    tscript0,    0, 2, "stop tscript <port> [<ipaddress>]" },
  1311. #endif
  1312. #ifdef ALLSERV
  1313.     { "ttylink",    ttyl0,        0, 0, NULLCHAR },
  1314. #endif
  1315. #ifdef TUTOR
  1316.     { "tutor",    tutor0,        0, 0, NULLCHAR },
  1317. #endif
  1318. #ifdef XSERVER
  1319.     { "xserver",    xserver0,    0, 0, NULLCHAR },
  1320. #endif
  1321.     { NULLCHAR,    0,        0, 0, NULLCHAR }
  1322. };
  1323.  
  1324.  
  1325.  
  1326. static int
  1327. dostart (int argc, char *argv[], void *p)
  1328. {
  1329. int insave = 0, outsave = 0, swapped = 0;
  1330.  
  1331.     if (Curproc->input == Command->input) {
  1332.         insave = Curproc->input;
  1333.         outsave = Curproc->output;
  1334.         Curproc->input = Cmdpp->input;
  1335.         Curproc->output = Cmdpp->output;
  1336.         swapped = 1;
  1337.     }
  1338.     cmdparse_newproc_type = PTYPE_SERVER;
  1339.     (void) subcmd (Startcmds, argc, argv, p);
  1340.     cmdparse_newproc_type = PTYPE_NORMAL;
  1341.  
  1342.     if (swapped) {
  1343.         Curproc->input = insave;
  1344.         Curproc->output = outsave;
  1345.     }
  1346.     return 0;
  1347. }
  1348.  
  1349.  
  1350. static int
  1351. dostop (int argc, char *argv[], void *p)
  1352. {
  1353.     return subcmd (Stopcmds, argc, argv, p);
  1354. }
  1355.  
  1356. #endif /* SERVERS */
  1357.  
  1358.  
  1359.  
  1360. /* Various configuration-dependent functions */
  1361.  
  1362. /* put mbuf into Hopper for network task
  1363.  * returns 0 if OK
  1364.  */
  1365. int
  1366. net_route (struct iface *ifp, int type, struct mbuf *bp)
  1367. {
  1368. struct mbuf *nbp;
  1369. struct phdr phdr;
  1370.  
  1371.     if (ifp == NULLIF)    {
  1372.         kwait (NULL);
  1373.         return 0;
  1374.     }
  1375.  
  1376.     phdr.iface = ifp;
  1377.     phdr.type = (int16) type;
  1378.  
  1379.     if ((nbp = pushdown (bp, sizeof (phdr))) == NULLBUF)
  1380.         return -1;
  1381.  
  1382.     memcpy (&nbp->data[0], (char *) &phdr, sizeof (phdr));
  1383.     enqueue (&Hopper, nbp);
  1384.     /* Especially on slow machines, serial I/O can be quite
  1385.      * compute intensive, so release the machine before we
  1386.      * do the next packet.  This will allow this packet to
  1387.      * go on toward its ultimate destination. [Karn]
  1388.      */
  1389.     kwait (NULL);
  1390.  
  1391.     return 0;
  1392. }
  1393.  
  1394.  
  1395. /* Process packets in the Hopper */
  1396. static void
  1397. network (int i OPTIONAL, void *v1 OPTIONAL, void *v2 OPTIONAL)
  1398. {
  1399. struct mbuf *bp;
  1400. struct phdr phdr;
  1401. int i_state;
  1402. #ifdef RXECHO
  1403. struct mbuf *bbp;
  1404. #endif
  1405.  
  1406.     server_disconnect_io ();
  1407. loop:
  1408.     while (Hopper == NULLBUF)
  1409.         kwait (&Hopper);
  1410.     /* this is silly, first we turn ints on, then off again...? -WG7J */
  1411.     /* Process the input packet */
  1412.     /*    bp = dequeue(&Hopper);     */
  1413.  
  1414.     i_state = disable ();
  1415.     bp = Hopper;
  1416.     Hopper = Hopper->anext;
  1417.     bp->anext = NULLBUF;
  1418.  
  1419.     restore (i_state);
  1420.  
  1421.     (void) pullup (&bp, (unsigned char *) &phdr, sizeof (phdr));
  1422.     if (phdr.iface != NULLIF) {
  1423.         phdr.iface->rawrecvcnt++;
  1424.         phdr.iface->lastrecv = secclock ();
  1425.     }
  1426. #ifdef TRACE
  1427.     dump (phdr.iface, IF_TRACE_IN, (unsigned) phdr.type, bp);
  1428. #endif
  1429. #ifdef RXECHO
  1430.     /* If configured, echo this packet before handling - WG7J */
  1431.     /* But only if packet is not CL_KISS. Kiss packets must be */
  1432.     /* echoed after retrieving port info in kiss_recv() - OH2BNS */
  1433. #if defined (KISS) || defined(AX25)
  1434.     if (phdr.type != CL_KISS) {
  1435. #endif
  1436.         if (phdr.iface && phdr.iface->rxecho) {
  1437.             (void) dup_p (&bbp, bp, 0, len_p (bp));
  1438.             (void) (*phdr.iface->rxecho->raw) (phdr.iface->rxecho, bbp);
  1439.         }
  1440. #if defined (KISS) || defined(AX25)
  1441.     }
  1442. #endif
  1443. #endif /* RXECHO */
  1444.     switch (phdr.type) {
  1445. #ifdef    KISS
  1446.         case CL_KISS:
  1447.             kiss_recv (phdr.iface, bp);
  1448.             break;
  1449. #endif
  1450. #ifdef    AX25
  1451.         case CL_AX25:
  1452.             ax_recv (phdr.iface, bp);
  1453.             break;
  1454. #endif
  1455. #ifdef    ETHER
  1456.         case CL_ETHERNET:
  1457.             eproc (phdr.iface, bp);
  1458.             break;
  1459. #endif
  1460. #ifdef ARCNET
  1461.         case CL_ARCNET:
  1462.             aproc (phdr.iface, bp);
  1463.             break;
  1464. #endif
  1465. #ifdef PPP
  1466.         case CL_PPP:
  1467.             ppp_proc (phdr.iface, bp);
  1468.             break;
  1469. #endif
  1470.             /* These types have no link layer protocol at the point when they're
  1471.              * put in the hopper, so they can be handed directly to IP. The
  1472.              * separate types are just for user convenience when running the
  1473.              * "iface" command.
  1474.              */
  1475.         case CL_NONE:
  1476.         case CL_SERIAL_LINE:
  1477.         case CL_SLFP:
  1478.             (void) ip_route (phdr.iface, bp, 0);
  1479.             break;
  1480.         default:
  1481.             free_p (bp);
  1482.             break;
  1483.     }
  1484.     /* Let everything else run - this keeps the system from wedging
  1485.      * when we're hit by a big burst of packets
  1486.      */
  1487.     kwait (NULL);
  1488.     goto loop;
  1489. }
  1490.